import re
import tkinter
import tkinter.messagebox


root =tkinter.Tk()

root.geometry('300x270+400+100')

root.resizable(False, False)

root.title('简易计算机-董付国')

contentVar=tkinter.StringVar(root,'')
contentEntry=tkinter.Entry(root, textvariable=contentVar)
contentEntry['state']='readonly'
contentEntry.place(x=10, y=10, width=280, height=20)

def buttonClick(btn):
    content=contentVar.get()
    if content.startswith('.'):
        content='0'+content
    if btn in '0123456789':
            content += btn
    elif btn == '.':
            
        lastPart=re.split(r'\+|-|\*|/]', content)[-1]
        if '.' in lastPart:
            tkinter.messagebox.showerror('错误', '小数点太多了')
            return
        else:
                content += btn
    elif btn=='C':
            content=''
    elif btn=='=':
            try:
                content=str(eval(content))
            except:
                tkinter.messagebox.showerror('错误', '表达式有误')
                return
    elif btn in operators:
            if content.endswith(operators):
                tkinter.messagebox.showerror('错误', '不能连续输入运算符')
                return
            content+=btn
    elif btn =='Sqrt':
            n=content.split('.')
            if all (map(lambda x:x.isdigit(), n)):
                content=eval(content)**0.5
            else:
                tkinter.messagebox.showerror('错误', '表达式有误')
                return
    contentVar.set(content)
btnClear=tkinter.Button(root, text='Clear', command=lambda:buttonClick('C'))   
btnClear.place(x=40, y=40, width=80, height=20) 
btnCompute=tkinter.Button(root, text='=', command=lambda:buttonClick('='))
btnCompute.place(x=170, y=40, width=80, height=20)
digits=list('0123456789.')+['sqrt']
index=0
for row in range(4):
            for col in range(3):
                d=digits[index]
                index += 1
                btnDigit=tkinter.Button(root, text=d, command=lambda x=d:buttonClick(x))
                btnDigit.place(x=20+col*70, y=80+row*50, width=50, height=20)
operators=('+', '-', '*', '//','/','**')
for index,operator in enumerate(operators):
            btnOperator=tkinter.Button(root, text=operator, command=lambda x=operator:buttonClick(x))
            btnOperator.place(x=230, y=80+index*30, width=50, height=20)
root.mainloop()